iT邦幫忙

0

Visual studio 2019 使用AddressSanitizer檢查程式碼

  • 分享至 

  • xImage
  •  

AddressSanitizer (ASan) 是一種編譯器和執行時間技術,會以 零 誤報來公開許多難以發現的 bug:

  • 配置/dealloc 不符和delete 類型不符
  • 配置太大而無法堆積
  • 溢位和 溢位
  • 免費且免費使用
  • 全域變數溢位
  • 堆積緩衝區溢位
  • 對齊的值對齊無效
  • memcpy和memcpy
  • 堆疊緩衝區溢 位和 下溢
  • 堆疊使用 並在範圍後使用
  • 有害之後的記憶體使用量

安裝 AddressSanitizer

從 Visual Studio 2019 16.9 版開始,Microsoft C/c + + 編譯器 (MSVC) 和 IDE 支援AddressSanitizer

  1. 開啟Visual studio installer

    更新或確認Visual studio版本
  2. 點選編輯
  3. 安裝 ASan,預設已經安裝好了,若沒有可以在個別元件搜尋安裝

使用 Visual Studio 中的 AddressSanitizer

先根據官網提供的source code建立一個CPP檔案

// basic-global-overflow.cpp
#include <stdio.h>
int x[100];
int main() {
    #ifdef __SANITIZE_ADDRESS__
    printf("Address sanitizer enabled\n");
    #else
    printf("Address sanitizer not enabled\n");
    #endif
    printf("Hello!\n");
    x[100] = 5; // Boom!
    return 0;
}

設定ASan
專案屬性 → C/C++ → 一般 → 啟用[ASan] 選擇

MSVS的 AddressSanitizer 已知問題 有開啟ASan還需進行一些設定,才能正常使用
我的環境需要將 偵錯資訊格式 設定成 ,才可以正常使用

測試範例

F5執行後顯示錯誤訊息

0x007a9350 is located 0 bytes to the right of global variable 'x' defined in 'main.cpp:3:4' (0x7a91c0) of size 400
這邊顯示顯示錯誤的地方

#0 0x7a1081 in main+0x61 (D:\temp\stdThreadPrj\Debug\stdThreadPrj.exe+0x401081)
這個部分可以參考 使用visual studio trace call stack的private function 來找到錯誤的位置

reference
[1] AddressSanitizer | Microsoft Docs


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言